home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 726-750 / 729 / bbbbs / bbbbs54.lzh / rexx / bbsUSER.rexx < prev    next >
OS/2 REXX Batch file  |  1992-04-21  |  9KB  |  314 lines

  1. /*   $VER: 5.1 bbsUSER.rexx 21 Apr 1992 (21.4.92)
  2.         -  counts upload/download statistics -
  3. copyright 1990 Richard Lee Stockton - FREELY DISTRIBUTABLE
  4. */
  5.  
  6. HOW_MANY=10
  7. CALL PRAGMA('P',-2)
  8.  
  9. SIGNAL ON ERROR
  10. SIGNAL ON SYNTAX
  11. SIGNAL ON FAILURE
  12. NUMERIC DIGITS 14
  13.  
  14. inarg=''
  15. PARSE ARG inarg .
  16. test=COMPRESS(UPPER(inarg),' -')
  17. IF test='?' | test='H' | test='USAGE' | test='HELP' THEN
  18.   DO
  19.     SAY 'Usage: rx bbsUSER [filename or CLI]'
  20.     SAY
  21.     SAY 'CLI writes to the console.'
  22.     SAY 'If a filename or the letters CLI are not included,'
  23.     SAY 'writes to a file called Information/STATS.USER'
  24.   END
  25.  
  26. figarg='s:CONFIG.BBS'
  27. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  28. x=OPEN(f,figarg,'R')
  29. IF x=0 THEN
  30.   DO
  31.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  32.     EXIT(20)
  33.   END
  34.  
  35. CALL SETCLIP('BBS_STAT','ON')
  36. lynes.=''
  37. DO i=1 TO 6
  38.   lynes.i=READLN(f)
  39. END
  40. CALL CLOSE(f)
  41.  
  42. compos=POS('/*',lynes.1)
  43. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  44.  
  45. bbsname = STRIP(lynes.1)
  46. sysop   = WORD(lynes.2,1)
  47. bbspath = WORD(lynes.6,1)
  48. IF ~EXISTS(bbspath) THEN
  49.   DO
  50.     SAY bbspath 'does not exist!'
  51.     CALL SETCLIP('BBS_STAT')
  52.     EXIT(20)
  53.   END
  54. testchar=RIGHT(bbspath,1)
  55. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  56.  
  57. counts.=0
  58. DO j=1 TO HOW_MANY
  59.   counts.LOW.j=999999999
  60. END
  61. counts.AGE_YOUNGEST=99999999
  62. userlist=SHOWDIR(bbspath'Users','F')
  63. x=FIND(userlist,sysop)
  64. IF x>0 THEN userlist=DELWORD(userlist,x,1)
  65. DO i=1 TO WORDS(userlist)
  66.   thisuser=WORD(userlist,i)
  67.   x=OPEN(f,bbspath'Users/'thisuser,'R')
  68.   IF x=0 THEN
  69.     DO
  70.       SAY thisuser 'userfile would not open!'
  71.       ITERATE i
  72.     END
  73.   lynes.=''
  74.   DO j=1 TO 23
  75.     line=READLN(f)
  76.     IF EOF(f) THEN LEAVE j
  77.     lynes.j=line
  78.   END
  79.   CALL CLOSE(f)
  80.   callcount=WORD(lynes.19,6)
  81.   counts.CALLS=counts.CALLS+callcount
  82.   DO j=HOW_MANY TO 1 BY -1 WHILE callcount>counts.CALLS.j
  83.     jj=j+1
  84.     counts.CALLS.jj=counts.CALLS.j
  85.     counts.ID.CALLS.jj=counts.ID.CALLS.j
  86.     counts.CALLS.j=callcount
  87.     counts.ID.CALLS.j=thisuser
  88.   END
  89.   ontime=WORD(lynes.19,1)*60+WORD(lynes.19,3)
  90.   counts.MINUTES=counts.MINUTES+ontime
  91.   DO j=HOW_MANY TO 1 BY -1 WHILE ontime>counts.ON_MINS.j
  92.     jj=j+1
  93.     counts.ON_MINS.jj=counts.ON_MINS.j
  94.     counts.ID.ON_MINS.jj=counts.ID.ON_MINS.j
  95.     counts.ON_MINS.j=ontime
  96.     counts.ID.ON_MINS.j=thisuser
  97.   END
  98.   IF WORDS(lynes.12)>3 & DATATYPE(WORD(lynes.12,4),'N') THEN
  99.     DO
  100.       counts.AGE_INDEX=counts.AGE_INDEX+1
  101.       age=0
  102.       IF UPPER(WORD(lynes.12,3))='AGE:' THEN
  103.         DO
  104.           age=WORD(lynes.12,4)
  105.           counts.AGE_TOTAL=counts.AGE_TOTAL+age
  106.         END
  107.       ELSE IF UPPER(WORD(lynes.12,3))='BIRTHDAY:' THEN
  108.         DO
  109.           age=LEFT(DATE('S'),4)-LEFT(WORD(lynes.12,4),4)
  110.           counts.AGE_TOTAL=counts.AGE_TOTAL+age
  111.           IF SUBSTR(DATE('S'),5,2)<SUBSTR(WORD(lynes.12,4),5,2) THEN
  112.             DO
  113.               counts.AGE_TOTAL=counts.AGE_TOTAL-1
  114.               age=age-1
  115.             END
  116.         END
  117.       IF age>0 & age<counts.AGE_YOUNGEST THEN counts.AGE_YOUNGEST=age
  118.       IF age>counts.AGE_OLDEST THEN counts.AGE_OLDEST=age
  119.     END
  120.   upfiles=0
  121.   upbytes=1
  122.   dnfiles=0
  123.   dnbytes=1
  124.   IF WORDS(lynes.14)>3 THEN
  125.     DO
  126.       upfiles=WORD(lynes.14,1)
  127.       upbytes=WORD(lynes.14,3)
  128.     END
  129.   IF WORDS(lynes.15)>3 THEN
  130.     DO
  131.       dnfiles=WORD(lynes.15,1)
  132.       dnbytes=WORD(lynes.15,3)
  133.     END
  134.   IF upbytes<1 THEN upbytes=1
  135.   counts.UP_FILES=counts.UP_FILES+upfiles
  136.   counts.UP_BYTES=counts.UP_BYTES+upbytes
  137.   counts.DN_FILES=counts.DN_FILES+dnfiles
  138.   counts.DN_BYTES=counts.DN_BYTES+dnbytes
  139.   DO j=HOW_MANY TO 1 BY -1 WHILE upfiles>counts.HIGH.UP_FILES.j
  140.     jj=j+1
  141.     counts.HIGH.UP_FILES.jj=counts.HIGH.UP_FILES.j
  142.     counts.ID.UP_FILES.jj=counts.ID.UP_FILES.j
  143.     counts.HIGH.UP_FILES.j=upfiles
  144.     counts.ID.UP_FILES.j=thisuser
  145.   END
  146.   DO j=HOW_MANY TO 1 BY -1 WHILE upbytes>counts.HIGH.UP_BYTES.j
  147.     jj=j+1
  148.     counts.HIGH.UP_BYTES.jj=counts.HIGH.UP_BYTES.j
  149.     counts.ID.UP_BYTES.jj=counts.ID.UP_BYTES.j
  150.     counts.HIGH.UP_BYTES.j=upbytes
  151.     counts.ID.UP_BYTES.j=thisuser
  152.   END
  153.   DO j=HOW_MANY TO 1 BY -1 WHILE dnfiles>counts.HIGH.DN_FILES.j
  154.     jj=j+1
  155.     counts.HIGH.DN_FILES.jj=counts.HIGH.DN_FILES.j
  156.     counts.ID.DN_FILES.jj=counts.ID.DN_FILES.j
  157.     counts.HIGH.DN_FILES.j=dnfiles
  158.     counts.ID.DN_FILES.j=thisuser
  159.   END
  160.   DO j=HOW_MANY TO 1 BY -1 WHILE dnbytes>counts.HIGH.DN_BYTES.j
  161.     jj=j+1
  162.     counts.HIGH.DN_BYTES.jj=counts.HIGH.DN_BYTES.j
  163.     counts.ID.DN_BYTES.jj=counts.ID.DN_BYTES.j
  164.     counts.HIGH.DN_BYTES.j=dnbytes
  165.     counts.ID.DN_BYTES.j=thisuser
  166.   END
  167.   IF (dnbytes=1)&(upbytes=1) THEN NOP
  168.   ELSE
  169.     DO j=HOW_MANY TO 1 BY -1 WHILE (dnbytes/upbytes)<counts.LOW.j
  170.       jj=j+1
  171.       counts.LOW.jj=counts.LOW.j
  172.       counts.ID.LOW.jj=counts.ID.LOW.j
  173.       counts.LOW.j=dnbytes/upbytes
  174.       counts.ID.LOW.j=thisuser
  175.     END
  176.   DO j=HOW_MANY TO 1 BY -1 WHILE (dnbytes/upbytes)>counts.HIGH.j
  177.     jj=j+1
  178.     counts.HIGH.jj=counts.HIGH.j
  179.     counts.ID.HIGH.jj=counts.ID.HIGH.j
  180.     counts.HIGH.j=dnbytes/upbytes
  181.     counts.ID.HIGH.j=thisuser
  182.   END
  183.   totwrit=0
  184.   DO j=1 TO 99
  185.     thisnum=WORD(lynes.23,j)
  186.     IF DATATYPE(thisnum,'N') THEN totwrit=totwrit+thisnum
  187.   END
  188.   DO j=HOW_MANY TO 1 BY -1 WHILE totwrit>counts.HIGH.MSGS.j
  189.     jj=j+1
  190.     counts.HIGH.MSGS.jj=counts.HIGH.MSGS.j
  191.     counts.ID.MSGS.jj=counts.ID.MSGS.j
  192.     counts.HIGH.MSGS.j=totwrit
  193.     counts.ID.MSGS.j=thisuser
  194.   END
  195. END
  196.  
  197.  
  198. /* OUTPUT */
  199.  
  200. IF inarg='' THEN inarg=bbspath'Information/STATS.USER'
  201. IF UPPER(inarg)~='CLI' THEN
  202.   DO
  203.     CALL CLOSE(STDOUT)
  204.     CALL OPEN(STDOUT,inarg,'W')
  205.     IF x=0 THEN
  206.       DO
  207.         SAY inarg 'would not open for writing!'
  208.         CALL SETCLIP('BBS_STAT')
  209.         EXIT(20)
  210.       END
  211.   END
  212.  
  213. SAY LEFT('-',75,'-')
  214. SAY CENTER(bbsname 'USER statistics through' DATE() 'at' TIME('C'),75)
  215. SAY LEFT('-',75,'-')
  216. SAY CENTER('Does not include sysop.',75)
  217. SAY LEFT('-',75,'-')
  218. SAY
  219. IF counts.AGE_INDEX>0 THEN
  220.   SAY CENTER('Of' WORDS(userlist) 'total users,' counts.AGE_INDEX 'gave their ages.',75)
  221.   SAY CENTER('The youngest is' counts.AGE_YOUNGEST'    The oldest is' counts.AGE_OLDEST'    The average is' TRUNC(counts.AGE_TOTAL/counts.AGE_INDEX+.005,2),75)
  222. SAY
  223. SAY RIGHT(comma(counts.UP_BYTES),15) 'bytes in' RIGHT(comma(counts.UP_FILES),7) 'files have been uploaded by these users.'
  224. SAY RIGHT(comma(counts.DN_BYTES),15) 'bytes in' RIGHT(comma(counts.DN_FILES),7) 'files have been downloaded by these users.'
  225. SAY
  226. SAY
  227. SAY 'Most public  messages:' RIGHT(comma(counts.HIGH.MSGS.1),14) counts.ID.MSGS.1
  228. DO j=2 TO HOW_MANY
  229.   IF counts.HIGH.MSGS.j>0 THEN
  230.     SAY RIGHT(comma(counts.HIGH.MSGS.j),37) counts.ID.MSGS.j
  231. END
  232. SAY
  233. SAY 'Most files   uploaded:' RIGHT(comma(counts.HIGH.UP_FILES.1),14) counts.ID.UP_FILES.1
  234. DO j=2 TO HOW_MANY
  235.   IF counts.HIGH.UP_FILES.j>0 THEN
  236.     SAY RIGHT(comma(counts.HIGH.UP_FILES.j),37) counts.ID.UP_FILES.j
  237. END
  238. SAY
  239. SAY 'Most bytes   uploaded:' RIGHT(comma(counts.HIGH.UP_BYTES.1),14) counts.ID.UP_BYTES.1
  240. DO j=2 TO HOW_MANY
  241.   IF counts.HIGH.UP_BYTES.j>0 THEN
  242.     SAY RIGHT(comma(counts.HIGH.UP_BYTES.j),37) counts.ID.UP_BYTES.j
  243. END
  244. SAY
  245. SAY 'Most files downloaded:' RIGHT(comma(counts.HIGH.DN_FILES.1),14) counts.ID.DN_FILES.1
  246. DO j=2 TO HOW_MANY
  247.   IF counts.HIGH.DN_FILES.j>0 THEN
  248.     SAY RIGHT(comma(counts.HIGH.DN_FILES.j),37) counts.ID.DN_FILES.j
  249. END
  250. SAY
  251. SAY 'Most bytes downloaded:' RIGHT(comma(counts.HIGH.DN_BYTES.1),14) counts.ID.DN_BYTES.1
  252. DO j=2 TO HOW_MANY
  253.   IF counts.HIGH.DN_BYTES.j>0 THEN
  254.     SAY RIGHT(comma(counts.HIGH.DN_BYTES.j),37) counts.ID.DN_BYTES.j
  255. END
  256. SAY
  257. SAY
  258. SAY 'Best  (lowest)  ratio, downloads divided by uploads:'
  259. DO j=1 TO HOW_MANY
  260.   IF counts.LOW.j<999999999 THEN
  261.     SAY RIGHT(comma(counts.LOW.j%1)||RIGHT(TRUNC(counts.LOW.j+.000005,5),6),37) counts.ID.LOW.j
  262. END
  263. SAY
  264. SAY 'Worst (highest) ratio, downloads divided by uploads:'
  265. DO j=1 TO HOW_MANY
  266.   IF counts.HIGH.j>0 THEN
  267.     SAY RIGHT(comma(counts.HIGH.j%1),37) counts.ID.HIGH.j
  268. END
  269. SAY
  270. SAY 'Most Minutes Spent On' bbsname':'
  271. DO j=1 TO HOW_MANY
  272.   IF counts.ON_MINS.j>0 THEN
  273.     SAY RIGHT(comma(counts.ON_MINS.j%1),37) counts.ID.ON_MINS.j
  274. END
  275. SAY
  276. SAY 'Most Calls To' bbsname':'
  277. DO j=1 TO HOW_MANY
  278.   IF counts.CALLS.j>0 THEN
  279.     SAY RIGHT(comma(counts.CALLS.j%1),37) counts.ID.CALLS.j
  280. END
  281. SAY
  282. SAY 'Average Usage In Minutes Per Call:' TRUNC(.05+counts.MINUTES/counts.CALLS,1)
  283. SAY
  284. CALL SETCLIP('BBS_STAT')
  285. EXIT;
  286.  
  287.  
  288. comma:
  289. ARG num .
  290. dgt=LENGTH(num)
  291. numtext=''
  292. IF dgt>3 THEN numtext=','RIGHT(num,3)
  293. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  294. IF dgt>9 THEN
  295.   DO
  296.     numtext=','LEFT(RIGHT(num,9),3)||numtext
  297.     numtext=LEFT(num,dgt-9)||numtext
  298.   END
  299. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  300. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  301. ELSE numtext=num
  302. RETURN(numtext)
  303.  
  304.  
  305. SYNTAX:
  306. FAILURE:
  307. ERROR:
  308. SAY 'Line:' SIGL ERRORTEXT(RC)
  309. SAY thisuser
  310. SAY
  311. EXIT;
  312.  
  313. /* end of bbsUSER.rexx */
  314.